package com.itany.corejava.code12_集合.list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 石小俊
 * @version 1.0
 * @date 2023年03月21日 10:29
 */
public class Test01_ArrayList {

    public static void main(String[] args) {
        test02();
    }

    public static void test01() {
        // 定义方式一
        // 构造一个初始容量为10的集合
        // 表示初始可以直接存放10个元素
        // 当超过10个之后会对长度进行扩展
        // 但是获取长度时按照当前实际上的元素个数计算
        // 可以为集合设置泛型类型,如果没有设置,则相当于Object
        ArrayList list = new ArrayList();
        // add():向集合中添加一个元素
        list.add(1);
        list.add("admin");
        list.add(true);
        list.add(3.14);
        list.add('c');
        list.add(null);
        list.add(new Object());
        System.out.println(list);
        // 返回集合中元素的数量
        System.out.println(list.size());

        // 可以为集合设置泛型,设置后集合中元素的类型被固定
        ArrayList<Integer> list2 = new ArrayList<>();
        // 直接存储数字,实际上是先装箱后存储
        list2.add(1);
        list2.add(new Integer(12));
        list2.add(13);
        list2.add(22);
        // 此时元素的类型已经固定,只能是Integer
        // 如果存储其他类型,会报错
        // numbers.add("admin"); // 报错
        System.out.println(list2);

        // 以下属于List定义方式
        // 在Arrays工具类中,可以将一个可变长字符串转换成List集合
        // 此时只能通过List接收
        List<String> list3 = Arrays.asList("admin", "jack", "tom", "alice");
        System.out.println(list3);
        // 可变长参数属于一种特殊的数组
        // 数组也可以作为参数
        String[] arr = {"admin", "jack", "tom", "alice"};
        List<String> list4 = Arrays.asList(arr);
        System.out.println(list4);

        // 定义方式二:可以将一个指定的Collection转换成对应的ArrayList集合
        ArrayList<String> list5 = new ArrayList<>(list3);
        System.out.println(list5);


        // 定义方式三:定义一个指定容量的集合
        // 此时的容量不是元素的个数,个数根据添加进去的元素而定
        // 此时的个数为0
        ArrayList<String> list6 = new ArrayList<>(5);
        System.out.println(list6.size());

    }

    public static void test02() {
        ArrayList<String> list = new ArrayList<>();
        System.out.println("集合是否为空:" + list.isEmpty());
        // 向集合的末尾添加
        list.add("admin");
        list.add("alice");
        list.add("jack");
        list.add("admin");
        list.add("jack");
        // 向指定索引位置添加
        list.add(1, "tom");
        System.out.println(list);

        // 修改指定索引的元素值,并返回被修改前的元素
        System.out.println(list.set(2, "lily"));
        System.out.println(list);

        // 删除第一次出现的元素
        System.out.println(list.remove("admin"));
        ;
        // 如果指定元素不存在,则返回false,不删除任何元素
        System.out.println(list.remove("aaa"));
        ;
        System.out.println(list);

        // 删除指定索引位置的元素,并返回被删除的元素
        System.out.println(list.remove(1));
        System.out.println(list);

        // 获取指定索引位置的元素值
        System.out.println(list.get(2));

        System.out.println(list.size());
        System.out.println("集合是否为空:" + list.isEmpty());

        System.out.println(list.indexOf("jack"));
        System.out.println(list.indexOf("aaa"));

        System.out.println(list.lastIndexOf("jack"));
        System.out.println(list.lastIndexOf("alice"));

        System.out.println("集合中是否存在admin:" + list.contains("admin"));
        System.out.println("集合中是否存在alice:" + list.contains("alice"));

        // 返回Object数组
        Object[] arr = list.toArray();
        System.out.println(Arrays.toString(arr));

        // 指定接收的数组长度
        String[] names = new String[10];
        String[] names2 = list.toArray(names);
        System.out.println(Arrays.toString(names2));

        list.clear();
        System.out.println(list);
    }



}
